#ifndef lib_included
#define lib_included

/**
* @file libreria.h
*
*	 Nel file libreria.h è presente:
*	  - la classe Service che definsce un'interfaccia per i vari servizi
*	  - le funzioni per la gestione dei socket, sia lato client che lato server
*	  - la funzione utilizzata dal client per la decodifica del messaggio dal Service 
*	    Register
*	
* @author Favale Angelo
* @author Fagioli Alessio
*
* @version 1.0
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <errno.h>
#include <arpa/inet.h>
#include <stdarg.h>
#include <ctype.h>
#include <pthread.h>
#include <unistd.h>

/** Dimensione massima di una stringa di caratteri*/
#define BUFFER_SIZE 512

/**
* @return L'intero identificatore del socket
*
* La funzione inizializzaSocket si occupa di creare un socket e di renderlo disponibile a chi
* invoca questa funzione.
*/
int inizializzaSocket();

/**
* @param ip_server Ip del server
* @param porta_server Porta del Server
*
* @return L'intero identificatore del socket
*
* La funzione inizializza_client si occupa di creare e predisporre opportunamente un socket 
* sul lato client.
* Il socket sarà quindi connesso con il server identificato da ip e porta.
*/
int inizializza_client( char * ip_server, int porta_server );

/**
* @param ip_server Ip del Server
* @param porta_server Porta del Server
* @param queue_size Coda d'attesa gestita dal Server
*
* @return L'intero identificatore del socket
*
* La funzione inizializza_server si occupa di creare e predisporre opportunamente un socket 
* sul lato server.
* Il socket viene quindi predisposto per attendere al massimo queue_size richieste sul 
* server identificato da ip e porta.
*/
int inizializza_server( char * ip_server, int porta_server, int queue_size );

/**
* @param msg Messaggio da decodificare
* @param ip_service_provider Ip del Service Provider ritornata per riferimento
* @param porta_service_provider Porta del Service Provider ritornata per riferimento
*
* @return true se il messaggio è stato decodificato correttamente, false altrimenti
*
* La funzione decode_msg_from_service_register si occupa di decodificare il messaggio 
* ricevuto dal Service Register.
* In particolare estrae dal messaggio le informazioni per poter contattare il Service 
* Provider che offre il servizio richiesto.
*/
bool decode_msg_from_service_register( char * msg, char * ip_service_provider, int * porta_service_provider );

/**
* @param nome_file Nome di un file
*
* @return La dimensione del file nome_file espressa in byte
*
* La funzione get_len_image si occupa di misurare la dimensione del file nome_file
*/
int get_len_image(char * nome_file);

/**
* La struttura host mantiene le informazioni relative all'indirizzo di un determinato Service
* Provider
*/
struct host
{
	int s; 				/**< Identificatore del socket		*/	
	char ip [INET_ADDRSTRLEN]; 	/**< Ip associato a questo socket	*/	
	int porta; 			/**< Porta associata a questo socket	*/	
};

/**
* @class Service
*
*	 La classe Service implementa un'interfaccia per i vari Service Provider.
*/
class Service
{
	protected:
		char name [BUFFER_SIZE]; 	/**< Nome del Servizio da implementare	  */
		host client; 			/**< Mantiene informazioni sul client che
						*    richiede il servizio		  */
	public:
		/**
		* Il costrutture carica le informazioni riguardanti il servizio ed il client 
		* che ne fa domanda
		*/
		Service( host client, char * name );
};

#endif
